package com.company.jee.common.utilities;

import java.io.FileInputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Properties;

import com.company.jee.common.exception.SystemException;


/**
 * Esta clase permite acceder al manejo de propiedades cargadas desde un archivo
 * de propiedades. El nombre del archivo se debe configurar como una variable
 * del sistema de la forma: -Dconection.properties=path/xxx.properties
 * 
 * Una vez que la propiedad se carga por primera vez, se carga a un cache, de
 * forma que las siguiente vez que se solicita la misma propiedad, no se lee del
 * archivo sino desde el cache.
 * 
 * Para refrescar el cache de esta clase, se puede invocar el metodo estatico
 * refreshCache
 * 
 * @author Luis Felipe Sosa
 * 
 */
public class PropertiesLoader {
	private static HashMap<String, String> cachedProperties = new HashMap<String, String>();

	public PropertiesLoader() {
	}

	public static String loadProperty(String propertyName) throws Exception {
		String cacheProp = (String) cachedProperties.get(propertyName);

		if ((cacheProp != null) && (cacheProp.equals("") == false)) {
			return cacheProp;
		}

		String configFile = System.getProperties()
				.getProperty("conection.properties");

		if ((configFile == null) || configFile.equals("")) {
//			System.out
//					.println("WARNIG: Error cargando propiedad. Para utilizar la clase de ");
//			System.out
//					.println("manejo de propiedades de jee, debe incluir la ");
//			System.out
//					.println("referencia al archivo de propiedades como una variable ");
//			System.out
//					.println("de sistema con la sintaxis: -Dconection.properties=path/xxx.properties ");

			throw new Exception("Archivo de propiedades no configurado");
		}

		return loadProperty(propertyName, configFile);
	}

	public static String loadProperty(String propertyName, String sourceFile)
			throws SystemException {
		String propValue = null;

		try {
			Properties generalProperties = new Properties();
			generalProperties.load(new FileInputStream(sourceFile));

			Enumeration<?> prop = generalProperties.propertyNames();

			while (prop.hasMoreElements()) {
				String keyName = prop.nextElement().toString();

				if (keyName.equalsIgnoreCase(propertyName)) {
					propValue = generalProperties.getProperty(keyName);
				}
			}
			if (propValue != null) {
				cachedProperties.put(propertyName, propValue);
				return propValue;
			}

		} catch (Exception e) {
			throw new SystemException(e, "PropertiesLoader", "loadProperty");
		}

		throw new SystemException(new Exception(
				"Exepcion cargando el archivo de propiedades"),
				"PropertiesLoader", "loadProperty");

	}
}
